<?php

/**
 * Description of QueryFunctions
 *
 * @author a.novikov
 */
class QueryFunctions {

	public static function in($field, $values, $quote = TRUE) {
		return $quote ? self::inQuoted($field, $values) : self::inUnquoted($field, $values);
	}

	public static function inQuoted($field, $values) {
		$valuesString = Db::getConnection()->quote($values);
		return self::inImploded($field, $valuesString);
	}

	public static function inUnquoted($field, $values) {
		$valuesString = ArrayFunctions::implode($values);
		return self::inImploded($field, $valuesString);
	}

	public static function inIntegers($field, $values) {
		$valuesString = ArrayFunctions::implodeIntegers($values);
		return self::inImploded($field, $valuesString);
	}

	/**
	 *
	 * @param string $field имя поля
	 * @param string $implodedValues уже сформированный список значений
	 */
	public static function inImploded($field, $implodedValues) {
		self::quoteColName($field);
		$implodedValues = trim($implodedValues);

		return ($implodedValues === '') ? '0' : "{$field} in ({$implodedValues})";
	}

	public static function notIn($field, $values, $quote = TRUE) {
		return $quote ? self::notInQuoted($field, $values) : self::notInUnquoted($field, $values);
	}

	public static function notInQuoted($field, $values) {
		$valuesString = Db::getConnection()->quote($values);
		return self::notInImploded($field, $valuesString);
	}

	public static function notInUnquoted($field, $values) {
		$valuesString = ArrayFunctions::implode($values);
		return self::notInImploded($field, $valuesString);
	}

	public static function notInIntegers($field, $values) {
		$valuesString = ArrayFunctions::implodeIntegers($values);
		return self::notInImploded($field, $valuesString);
	}

	/**
	 *
	 * @param string $field имя поля
	 * @param string $implodedValues уже сформированный список значений
	 */
	public static function notInImploded($field, $implodedValues) {
		self::quoteColName($field);
		$implodedValues = trim($implodedValues);

		return ($implodedValues === '') ? '1' : "{$field} not in ({$implodedValues})";
	}

	public static function quoteColName (&$name) {
		$name = (string)$name;

		if ($name[0] !== '`') {
			$name = "`$name`";
		}

		return $name;
	}
}